package com.abe.libquick.utils.quick;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;

import androidx.core.content.FileProvider;

import com.abe.libcore.utils.context.ContextUtils;
import com.abe.libquick.utils.NormalUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class IntentHelper {
    private final static String[][] MIME_MapTable = {
            // {后缀名，MIME类型}
            {".3gp", "video/3gpp"},
            {".apk", "application/vnd.android.package-archive"},
            {".asf", "video/x-ms-asf"},
            {".avi", "video/x-msvideo"},
            {".bin", "application/octet-stream"},
            {".bmp", "image/bmp"},
            {".c", "text/plain"},
            {".class", "application/octet-stream"},
            {".conf", "text/plain"},
            {".cpp", "text/plain"},
            {".doc", "application/msword"},
            {".docx",
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
            {".xls", "application/vnd.ms-excel"},
            {".xlsx",
                    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
            {".exe", "application/octet-stream"},
            {".gif", "image/gif"},
            {".gtar", "application/x-gtar"},
            {".gz", "application/x-gzip"},
            {".h", "text/plain"},
            {".htm", "text/html"},
            {".html", "text/html"},
            {".jar", "application/java-archive"},
            {".java", "text/plain"},
            {".jpeg", "image/jpeg"},
            {".jpg", "image/jpeg"},
            {".js", "application/x-javascript"},
            {".log", "text/plain"},
            {".m3u", "audio/x-mpegurl"},
            {".m4a", "audio/mp4a-latm"},
            {".m4b", "audio/mp4a-latm"},
            {".m4p", "audio/mp4a-latm"},
            {".m4u", "video/vnd.mpegurl"},
            {".m4v", "video/x-m4v"},
            {".mov", "video/quicktime"},
            {".mp2", "audio/x-mpeg"},
            {".mp3", "audio/x-mpeg"},
            {".mp4", "video/mp4"},
            {".mpc", "application/vnd.mpohun.certificate"},
            {".mpe", "video/mpeg"},
            {".mpeg", "video/mpeg"},
            {".mpg", "video/mpeg"},
            {".mpg4", "video/mp4"},
            {".mpga", "audio/mpeg"},
            {".msg", "application/vnd.ms-outlook"},
            {".ogg", "audio/ogg"},
            {".pdf", "application/pdf"},
            {".png", "image/png"},
            {".pps", "application/vnd.ms-powerpoint"},
            {".ppt", "application/vnd.ms-powerpoint"},
            {".pptx",
                    "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
            {".prop", "text/plain"}, {".rc", "text/plain"},
            {".rmvb", "audio/x-pn-realaudio"}, {".rtf", "application/rtf"},
            {".sh", "text/plain"}, {".tar", "application/x-tar"},
            {".tgz", "application/x-compressed"}, {".txt", "text/plain"},
            {".wav", "audio/x-wav"}, {".wma", "audio/x-ms-wma"},
            {".wmv", "audio/x-ms-wmv"},
            {".wps", "application/vnd.ms-works"}, {".xml", "text/plain"},
            {".z", "application/x-compress"},
            {".zip", "application/x-zip-compressed"}, {"", "*/*"}};

    public static Intent openFile(File file) {
        return getFileIntent(Uri.fromFile(file), new Integer[]{Intent.FLAG_ACTIVITY_NEW_TASK}, getMIMEType(file));
        // 比如说你的MIME类型是打开邮箱，但是你手机里面没装邮箱客户端，就会报错。
    }

    private static String getMIMEType(File file) {
        String type = "*/*";
        String fName = file.getName();
        int dotIndex = fName.lastIndexOf("."); // 获取后缀名前的分隔符"."在fName中的位置。
        if (dotIndex < 0) {
            return type;
        }
        String end = fName.substring(dotIndex, fName.length()).toLowerCase(); /* 获取文件的后缀名 */
        if (TextUtils.isEmpty(end))
            return type;
        // 在MIME和文件类型的匹配表中找到对应的MIME类型。
        for (String[] aMIME_MapTable : MIME_MapTable) { // MIME_MapTable??在这里你一定有疑问，这个MIME_MapTable是什么？
            if (end.equals(aMIME_MapTable[0]))
                type = aMIME_MapTable[1];
        }
        return type;
    }

    // android获取一个用于打开HTML文件的intent
    public static Intent getHtmlFileIntent(String param) {
        Uri uri = Uri.parse(param).buildUpon()
                .encodedAuthority("com.android.htmlfileprovider")
                .scheme("content").encodedPath(param).build();
        Intent intent = getFileIntent(uri, new Integer[0], "text/html");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    // android获取一个用于打开图片文件的intent
    public static Intent getImageFileIntent(String param) {
        Intent intent = getFileIntent(param, "image/*");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    // android获取一个用于打开PDF文件的intent
    public static Intent getPdfFileIntent(String param) {
        Intent intent = getFileIntent(param, "application/pdf");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    // android获取一个用于打开音频文件的intent
    public static Intent getAudioFileIntent(String param) {
        Uri uri = Uri.fromFile(new File(param));
        Intent intent = getFileIntent(uri, new Integer[]{Intent.FLAG_ACTIVITY_CLEAR_TOP}, "audio/*\"/*");
        intent.putExtra("oneshot", 0);
        intent.putExtra("configchange", 0);
        return intent;

    }

    // android获取一个用于打开视频文件的intent
    public static Intent getVideoFileIntent(String param) {
        Uri uri = Uri.fromFile(new File(param));
        Integer[] x = new Integer[]{Intent.FLAG_ACTIVITY_CLEAR_TOP};
        Intent intent = getFileIntent(uri, x, "video/*");
        intent.putExtra("oneshot", 0);
        intent.putExtra("configchange", 0);
        return intent;
    }

    // android获取一个用于打开CHM文件的intent
    public static Intent getChmFileIntent(String param) {
        Intent intent = getFileIntent(param, "application/x-chm");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    // android获取一个用于打开Word文件的intent
    public static Intent getWordFileIntent(String param) {
        Intent intent = getFileIntent(param, "application/msword");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    // android获取一个用于打开Excel文件的intent
    public static Intent getExcelFileIntent(String param) {
        Intent intent = getFileIntent(param, "application/vnd.ms-excel");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    // android获取一个用于打开PPT文件的intent
    public static Intent getPptFileIntent(String param) {
        Intent intent = getFileIntent(param, "application/vnd.ms-powerpoint");
        intent.addCategory("android.intent.category.DEFAULT");
        return intent;
    }

    //*************************************************************************************************************************
    public static Intent getFileIntent(String filePath, String type) {
        return getFileIntent(ContextUtils.Companion.getContext(), filePath, type);
    }

    public static Intent getFileIntent(File mFile, String type) {
        return getFileIntent(ContextUtils.Companion.getContext(), mFile, type);
    }

    public static Intent getFileIntent(Context context, String filePath, String type) {
        return getFileIntent(context, new File(filePath), type);
    }

    public static Intent getFileIntent(Context context, File mFile, String type) {
        Uri contentUri;
        List<Integer> flags = new ArrayList<>();
        flags.add(Intent.FLAG_ACTIVITY_NEW_TASK);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            //TODO 必须与AndroidManifest文件中一致
            contentUri = FileProvider.getUriForFile(context, NormalUtils.providerAuthorities(), mFile);
            flags.add(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
            contentUri = Uri.fromFile(mFile);
        }
        Integer[] x = new Integer[flags.size()];
        Intent intent = getFileIntent(contentUri, flags.toArray(x), type);
        for (int i = 0; i < flags.size(); i++) {
            intent.setFlags(flags.get(i));
        }
        intent.setDataAndType(contentUri, type);
        return intent;
    }

    public static Intent getFileIntent(Uri uri, Integer[] flags, String type) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        for (int flag : flags) {
            intent.setFlags(flag);
        }
        intent.setDataAndType(uri, type);
        return intent;
    }
}
